#ifndef PRUEBAESTRATEGIABLOQUES_H_
#define PRUEBAESTRATEGIABLOQUES_H_

#include "Alumno.h"
#include "ClaveAlumno.h"
#include "../EstrategiaAlmacenamientoBloques.h"
#include "../Archivo.h"


void pruebaAltaBusqueda(Toolkit::TipoSerializacion tSerializacion)
{
	stringstream stream;
	
	//ME CAGO EN LA PUTA QUE PARIO A C++. SI, VOS STROUSTRUP.
	//SI CAMBIO ALMACENAMIENTO POR ARCHIVO ANDA.
	Toolkit::Archivo almacenamiento(100, "", "pruebaAlumnos.txt", tSerializacion, stream);
			
	Toolkit::EstrategiaAlmacenamientoBloques estrategia(tSerializacion, 100);
		
	Toolkit::WrapperComponente wrapper = Toolkit::WrapperComponente(tSerializacion); //??
	
	Toolkit::Alumno facundo(87712, "Facundo Olano Jr.", tSerializacion);	
	estrategia.guardarDato(almacenamiento, facundo, 
			Toolkit::ClaveAlumno(facundo.getPadron(), tSerializacion), wrapper);
				
	Toolkit::Alumno dupont(55555, "Marcel Dupont", tSerializacion);
	estrategia.guardarDato(almacenamiento, dupont, 
			Toolkit::ClaveAlumno(dupont.getPadron(), tSerializacion), wrapper);
	
	
	unsigned long int posArtigas;
	Toolkit::Alumno artigas(11111, "Pepe Artigas", tSerializacion);
	posArtigas = estrategia.guardarDato(almacenamiento, artigas, 
			Toolkit::ClaveAlumno(artigas.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno iorio(88712, "Ricardo de la Concepción Iorio", tSerializacion);
	estrategia.guardarDato(almacenamiento, iorio, 
			Toolkit::ClaveAlumno(iorio.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno carolo(33333, "Carolo Bazofio", tSerializacion);
	estrategia.guardarDato(almacenamiento, carolo, 
			Toolkit::ClaveAlumno(carolo.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno pelotudo(22222, "Juan Carlos Pelotudo", tSerializacion);
	estrategia.guardarDato(almacenamiento, pelotudo, 
			Toolkit::ClaveAlumno(pelotudo.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno brown(87713, "Luis Almirante Brown", tSerializacion);
	estrategia.guardarDato(almacenamiento, brown, 
			Toolkit::ClaveAlumno(brown.getPadron(), tSerializacion), wrapper);
			
	
	Toolkit::Alumno aux(0, "AUXILIAR", tSerializacion);
	estrategia.recuperarDato(almacenamiento, posArtigas, aux, 
		Toolkit::ClaveAlumno(artigas.getPadron(), tSerializacion), wrapper);
	
	cout << "dato leído, nombre: " << aux.getNombre() << " padron: " 
			<< aux.getPadron() << endl;
			
	unsigned long int posAux;
	estrategia.busquedaSecuencial(almacenamiento, aux, 
		Toolkit::ClaveAlumno(iorio.getPadron(), tSerializacion), posAux, wrapper);
	
	cout << "dato leído secuencialmente, nombre: " << aux.getNombre() << " padron: " 
			<< aux.getPadron() << endl;
	
}

void pruebaModificacionRealocado(Toolkit::TipoSerializacion tSerializacion)
{
	stringstream stream;
	
	Toolkit::Archivo almacenamiento(100, "", "pruebaAlumnos.txt", tSerializacion, stream);
			
	Toolkit::EstrategiaAlmacenamientoBloques estrategia(tSerializacion, 100);
		
	Toolkit::WrapperComponente wrapper = Toolkit::WrapperComponente(tSerializacion); //??
	
	Toolkit::Alumno facundo(87712, "Facundo Olano Jr.", tSerializacion);	
	estrategia.guardarDato(almacenamiento, facundo, 
			Toolkit::ClaveAlumno(facundo.getPadron(), tSerializacion), wrapper);

	unsigned long int posDupont;				
	Toolkit::Alumno dupont(55555, "Marcel Dupont", tSerializacion);
	posDupont = estrategia.guardarDato(almacenamiento, dupont, 
			Toolkit::ClaveAlumno(dupont.getPadron(), tSerializacion), wrapper);
	
	unsigned long int posArtigas;	
	Toolkit::Alumno artigas(11111, "Pepe Artigas", tSerializacion);
	posArtigas = estrategia.guardarDato(almacenamiento, artigas, 
			Toolkit::ClaveAlumno(artigas.getPadron(), tSerializacion), wrapper);
			
	Toolkit::Alumno iorio(88712, "Ricardo de la Concepción del universo Iorio", tSerializacion);
	estrategia.guardarDato(almacenamiento, iorio, 
			Toolkit::ClaveAlumno(iorio.getPadron(), tSerializacion), wrapper);
			
	//modifico a dupont para que tenga que mandarlo adelante
	Toolkit::Alumno aux(dupont.getPadron(), "Marcel Dupont con nombre muchisimo mas largo", tSerializacion);
	posDupont = estrategia.modificarDato(almacenamiento, aux, 
		Toolkit::ClaveAlumno(dupont.getPadron(), tSerializacion), posDupont, wrapper);
		
	estrategia.recuperarDato(almacenamiento, posDupont, dupont, 
		Toolkit::ClaveAlumno(dupont.getPadron(), tSerializacion), wrapper);
	
	cout << "dato leído, nombre: " << dupont.getNombre() << " padron: " 
			<< dupont.getPadron() << endl;
			
	//Elimino a artigas para que haya muhco lugar libre en el primer bloque
	estrategia.eliminarDato(almacenamiento, posArtigas, artigas, 
			Toolkit::ClaveAlumno(artigas.getPadron(), tSerializacion), wrapper);
	
	//hago un par de altas, se supone que las manda al primer bloque
	
	Toolkit::Alumno carolo(33333, "Carolo Bazofio", tSerializacion);
	estrategia.guardarDato(almacenamiento, carolo, 
			Toolkit::ClaveAlumno(carolo.getPadron(), tSerializacion), wrapper);
	
	Toolkit::Alumno pelotudo(22222, "Juan Pelotudo", tSerializacion);
	estrategia.guardarDato(almacenamiento, pelotudo, 
			Toolkit::ClaveAlumno(pelotudo.getPadron(), tSerializacion), wrapper);
			
	//busco secuencialmente solo por hacer algo
	unsigned long int posAux;
	estrategia.busquedaSecuencial(almacenamiento, aux, 
		Toolkit::ClaveAlumno(carolo.getPadron(), tSerializacion), posAux, wrapper);
	
	cout << "dato leído secuencialmente, nombre: " << aux.getNombre() << " padron: " 
			<< aux.getPadron() << endl;	
	
}


#endif /*PRUEBAESTRATEGIABLOQUES_H_*/
